

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 订阅工作流程教程第 1 部分：将 Amazon SWF 与 适用于 Ruby 的 AWS SDK
<a name="swf-sns-tutorial-setup-swf"></a>

**Topics**
+ [包括 适用于 Ruby 的 AWS SDK](#include-the-sdk-for-ruby)
+ [配置会 AWS 话](#configuring-the-aws-session)
+ [注册 Amazon SWF 域](#registering-swf-domain)
+ [后续步骤](#next-steps)

## 包括 适用于 Ruby 的 AWS SDK
<a name="include-the-sdk-for-ruby"></a>

首先，创建一个名为 `utils.rb` 的文件。该文件中的代码将获取或创建（如有必要）工作流和活动代码所使用的 Amazon SWF 域，并提供一个位置来放置所有类通用的代码。

首先，我们需要在代码中包含 `aws-sdk-v1` 库，以便使用适用于 Ruby的 SDK 提供的功能。

```
require 'aws-sdk-v1'
```

这使我们能够访问 AWS 命名空间，从而能够设置与会话相关的全局值，例如您的 AWS 证书和区域，还可以访问该 AWS 服务。 APIs

## 配置会 AWS 话
<a name="configuring-the-aws-session"></a>

我们将通过设置 AWS 证书（访问 AWS 服务所需的凭证）和要使用的 AWS 区域来配置会 AWS 话。

在 [Ruby 的 AWS SDK 中设置 AWS 凭据的方法有很多：在](https://docs.aws.amazon.com/AWSRubySDK/latest/index.html#Basic_Configuration)环境变量（AWS\_ACCESS\_KEY\_ID 和 \_ACC AWS\_SECRET ESS\_KEY）中设置凭证，或者使用进行设置。[https://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method)我们将使用后一种方法，从一个名为 `aws-config.txt` 的 YAML 配置文件中加载这些证书，该文件内容类似于此。

```
---
:access_key_id: REPLACE_WITH_ACCESS_KEY_ID
:secret_access_key: REPLACE_WITH_SECRET_ACCESS_KEY
```

立即创建此文件，将以 REPLAC *E\_WITH\_ 开头的字符串替换*为您的 AWS 访问密钥 ID 和私有访问密钥。有关您的 AWS 访问密钥的信息，请参阅[如何获取安全证书？](https://docs.aws.amazon.com/general/latest/gr/getting-aws-sec-creds.html) 在 *Amazon Web Services 一般参考*中。

我们还需要设置要使用的 AWS 区域。由于我们将使用 Amazon SNS 的[短信服务 (SMS)](http://en.wikipedia.org/wiki/Short_Message_Service) 向用户手机发送文本消息，因此需要确保我们使用的是 Amazon SNS 支持的区域。请参阅《Amazon Simple Notification Service Developer Guide》中的 [Supported Regions and Countries](https://docs.aws.amazon.com/sns/latest/dg/sms_supported-countries.html)。

**注意**  
如果您无权访问 **us-east-1**，或不在乎运行演示时是否启用了手机短信，则可随意使用任何地区。您可以从示例中移除 SMS 功能，使用电子邮件作为订阅 Amazon SNS 主题的唯一端点。  
有关发送 SMS 消息的更多信息，请参阅《Amazon Simple Notification Service Developer Guide》**中的 [Sending and Receiving SMS Notifications Using Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/SMSMessages.html)。

现在，我们将在 `utils.rb` 中添加一些代码以加载配置文件、获取用户凭证，然后将凭证和区域同时提供给 [https://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS.html#config-class_method)。

```
require 'yaml'

# Load the user's credentials from a file, if it exists.
begin
  config_file = File.open('aws-config.txt') { |f| f.read }
rescue
  puts "No config file! Hope you set your AWS credentials in the environment..."
end

if config_file.nil?
  options = { }
else
  options = YAML.load(config_file)
end

# SMS Messaging (which can be used by Amazon SNS) is available only in the
# `us-east-1` region.
$SMS_REGION = 'us-east-1'
options[:region] = $SMS_REGION

# Now, set the options
AWS.config = options
```

## 注册 Amazon SWF 域
<a name="registering-swf-domain"></a>

要使用 Amazon SWF，您需要设置一个*域*，它是一个命名实体，用于存放您的工作流和活动。您可以注册多个 Amazon SWF 域名，但它们在您的 AWS 账户中都必须具有唯一的名称，并且工作流程不能跨域交互：您的应用程序的所有工作流程和活动都必须在同一个域中才能相互交互。

*由于我们将在整个应用程序中使用相同的域，因此我们将在名为 Domain 中创建一个函数`init_domain`，用于检索`utils.rb`名为 Domain 的 Amazon SWF 域。SWFSample*

注册域后，可将其重用于多个工作流程执行。但是，*尝试注册已存在的域是错误行为*，因此我们的代码首先将检查是否存在该域，如果可找到这个现有的域，则将使用它。如果无法找到该域，则我们将创建它。

要在适用于 Ruby 的 SDK 中使用 Amazon SWF 域名，请使用 w [AWS::Simpleorkflow.domains](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow.html#domains-instance_method)，它返回可用于枚举和注册域名的：[DomainCollection](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/DomainCollection.html)
+ 要查看某个域名是否已经注册，您可以查看 [AWS::Simpleworkflow.domains.registed](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/DomainCollection.html#registered-instance_method) 提供的列表。
+ 要注册新域名，请使用 [AWS::Simpleworkflow.domains.register。](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/DomainCollection.html#register-instance_method)

以下是 `init_domain` 中 `utils.rb` 的代码。

```
# Registers the domain that the workflow will run in.
def init_domain
  domain_name = 'SWFSampleDomain'
  domain = nil
  swf = AWS::SimpleWorkflow.new

  # First, check to see if the domain already exists and is registered.
  swf.domains.registered.each do | d |
    if(d.name == domain_name)
      domain = d
      break
    end
  end

  if domain.nil?
    # Register the domain for one day.
    domain = swf.domains.create(
      domain_name, 1, { :description => "#{domain_name} domain" })
  end

  return domain
end
```

## 后续步骤
<a name="next-steps"></a>

接下来，您将在[订阅工作流程教程第 2 部分：实现工作流程](swf-sns-tutorial-implementing-workflow.md)中创建工作流和启动程序代码。