

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 訂閱工作流程教學課程第 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 和 AWS\_SECRET\_ACCESS\_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
```

立即建立此檔案，以您的 AWS 存取金鑰 ID 和私密存取金鑰取代以 *REPLACE\_WITH\_* 開頭的字串。如需 AWS 存取金鑰的相關資訊，請參閱《*Amazon Web Services 一般參考*》中的[如何取得安全登入資料？](https://docs.aws.amazon.com/general/latest/gr/getting-aws-sec-creds.html)。

我們也需要設定要使用 AWS 的區域。由於我們將使用[簡訊服務 (SMS)](http://en.wikipedia.org/wiki/Short_Message_Service) 透過 Amazon SNS 將文字訊息傳送到使用者的電話，因此我們需要確定我們使用 Amazon SNS 支援的區域。請參閱《Amazon Simple Notification Service 開發人員指南》中的[支援的區域和國家](https://docs.aws.amazon.com/sns/latest/dg/sms_supported-countries.html)/地區。

**注意**  
如果您無法存取 **us-east-1**，或不在意能否執行啟用簡訊的示範，請隨意使用任一區域。您可以從範例中移除 SMS 功能，並使用電子郵件做為訂閱 Amazon SNS 主題的唯一端點。  
如需傳送簡訊的詳細資訊，請參閱《[Amazon Simple Notification Service 開發人員指南》中的使用 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 您的帳戶中都必須有唯一的名稱，而且工作流程無法跨網域互動：應用程式的所有工作流程和活動都必須位於相同的網域中，才能彼此互動。

由於我們將在整個應用程式中使用相同的網域，因此我們會在`utils.rb`名為 的 中建立函數`init_domain`，該函數會擷取名為 *SWFSampleDomain* 的 Amazon SWF 網域。

當您一註冊網域後，就可以重複使用它處理許多工作流程執行。但是，「嘗試註冊已存在的網域會發生錯誤」**，所以我們的程式碼會先檢查網域是否存在，若可找到現有網域，就會予以使用。如果找不到網域，就會予以建立。

若要在適用於 Ruby 的 SDK 中使用 Amazon SWF 網域，請使用 [AWS：：SimpleWorkflow.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.registered](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)。

以下為 `utils.rb` 中的 `init_domain` 程式碼。

```
# 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)」中建立工作流程和啟動者程式碼。