📶

AWS SAM コネクタを試してみた

2023/02/25に公開

SAMのコネクタとは

SAMで構築するリソース間の権限周り(IAMロール)をいい感じに構築してくれるものです。
コネクタを使用しない場合は、IAMロールを別途作成してそのロールを各リソースに付与する形になります。(もちろんこれもSAMテンプレートでできます。)

使い方

今回は試しにStepFunctionsとLambdaを構築してみました。
コネクタの使い所としては、StepFunctionsからLambdaを呼び出すためのポリシーを持ったロールが必要になるので。StepFunctionsにコネクタを設定します。
以下のようにテンプレートを書きました。

Transform: AWS::Serverless-2016-10-31
Resources:
  MySampleStateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      Definition:
        StartAt: MyLambdaState
        States:
          MyLambdaState:
            Type: Task
            Resource: !GetAtt MyFunction.Arn
            End: true
    Connectors:
      MyConn:
        Properties:
          Destination:
            Id: MyFunction
          Permissions:
            - Write
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9
      InlineCode: |
        def handler(event, context):
          print("Hello, world!")
      ReservedConcurrentExecutions: 30
      Timeout: 120

MySampleStateMachineの中にConnectorsプロパティがあります。
この部分がコネクタです。
DestinationのIdに送信先リソース(書き込みや読み込みをしたいリソース)の論理IDを指定します。
今回はLambdaになります。
PermissionsにはリストでReadとWriteのうち必要なものを書きます。
StepFunctionsからはLambdaを「呼び出す」ことになるので、Readかとおもいましたが、実際にはWriteでした。
送信元と送信先の組み合わせによって許可されているアクションが異なります。
詳しくはAWSのコネクタリファレンスで確認してください。

実際に構築されたロール

実際に構築されたロールを見ていきます。
CloudFormationのリソース一覧はこちらです。

上から4つ目のMySampleStateMachineMyConnPolicyがコネクタによって作成されたポリシーです。

ポリシーの中身がこちらです。

送信先のLambdaだけに対して必要なアクションだけが設定されています。

StepFunctionsのロールがこちらです。

さっきのポリシーが設定されています。

感想

簡単な記述で権限周りを作成することができました。
冒頭で書いたように別途IAMロールやポリシーを定義する方法に比べて以下のメリットがあります。

  • テンプレートの記述量が減る。
  • ポリシーで設定するターゲットリソースを勝手に絞ってくれる。
  • 許可するアクションを必要最低限のものだけ設定してくれる。

許可するアクションを調べるのがめんどくさかったりして、地味に時間を使ったりするので、これらのメリットはけっこう嬉しいです。
試してはないですが、おそらくサーバーレスアプリケーションリソースでしか使用できないので、それ以外のリソースでも使えるとさらに嬉しいですね。この辺はもう少し調べようと思います。

Discussion