3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Serverless Application Repositoryで他のAWSアカウントにもアプリを公開しよう

Posted at

##🔶 はじめに
本内容は、以下の続きです。
Lambda関数をアプリ化して、Serverless Application Repositoryで公開しよう [15分で完成編]

Serverless Application Repositoryにサーバレスアプリを登録することで、アカウント内でアプリを利用しやすくする事ができたので、今回は他のアカウントでもアプリを使えるようにしたいと思います。

##🔶 作業手順

  1. SAMファイルの、IAMの記述の修正
  2. Serverless Application Repositoryに、SAMファイルを再登録
  3. アプリを利用させたいAWSアカウントの登録

##🔶 SAMファイルの、IAMの記述の修正

1. SAMファイルの確認

修正前のSAMファイルは以下の通りです。
sampleHelloというLambda関数の設定情報のみが記載されています。

sample_Hello.yaml(修正前)
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
  sampleHello:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: s3://sample-hello-bucket/sample_Hello-cba9fc2c-bd5b-407c-81fa-cc8d832858ad.zip
      Description: ''
      MemorySize: 128
      Timeout: 3
      Role: 'arn:aws:iam::■■■■■■:role/service-role/sample_Hello-role-k6eww01p'

この設定で問題になるのが、Role: 'arn:aws:iam::■■■■■■:role/service-role/sample_Hello-role-k6eww01p'の記述です。
このLambda関数はsample_Hello-role-k6eww01pというロールを使う旨が記載されていますが、このロールは自分のAWSアカウントにはありますが、他のAWSアカウントには無いので、このSAMファイルに従ってデプロイを行うと、この部分でエラーが発生します。

そこで、sample_Hello-role-k6eww01pというロールがどういう内容のものか明記して、他のAWSアカウントでデプロイする際に、ロールも一緒に構築するようにします。

2. ロールのポリシーの確認

sample_Hello-role-k6eww01pというロールに、どのようなポリシーが付加されているか確認します。

すると、「AWSLambdaBasicExecutionRole-10eb65・・・・」というポリシーが付加されています。
001.png

これはAWSでデフォルトで用意されているポリシーをコピーして作ったものなので、実質は以下の「AWSLambdaBasicExecutionRole」と同じです。
よって、「AWSLambdaBasicExecutionRole」のポリシーARNをコピーします。
002.png

3. SAMファイルにロールの定義を追加
SAMファイルに、「AWSLambdaBasicExecutionRole」というポリシーを持った、「tsuikaRole」というロールの定義を追記します。

sample_Hello.yaml(ロールの定義を追記)
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
# ↓のRole定義を追加
  tsuikaRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
#     Policies: 
#       - 
#         PolicyName: "tsuikaPolicy"
#         PolicyDocument: 
#           Version: "2012-10-17"
#           Statement: 
#             - 
#               Effect: Allow
#               Action: 
#                 - "logs:CreateLogGroup"
#                 - "logs:CreateLogStream"
#                 - "logs:PutLogEvents"
#               Resource: "*"
  sampleHello:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: s3://sample-hello-bucket/sample_Hello-cba9fc2c-bd5b-407c-81fa-cc8d832858ad.zip
      Description: ''
      MemorySize: 128
      Timeout: 3
#     Role: 'arn:aws:iam::028784405484:role/service-role/sample_Hello-role-k6eww01p'
      Role: !GetAtt tsuikaRole.Arn

上記のtsuikaRoleのブロックが、ロールの定義情報です。
ポリシーの定義情報は、本来はコメントアウトしているPoliciesのように書いたりしますが、今回はAWSが管理している標準のポリシーを使うので、ManagedPolicyArnsとして、先程コピーしたポリシーARNをセットするだけで良いです。

また、sampleHelloも使用するロールが、今回定義するtsuikaRoleに変更になるので、!GetAtt tsuikaRole.Arnと記載します。
Fn::GetAttは、「このテンプレート内の指定した値(今回はtsuikaRole)の属性値を参照する」という記述です。

##🔶 Serverless Application Repositoryに、SAMファイルを再登録
1. SAMファイルの再登録
Serverless Application Repositoryの、登録したサーバレスアプリの画面を開き、[新しいバーションを発行]をクリックする。
003.png
「セマンティックバージョン」に、新しいバージョンNoを、「SAMテンプレート」に修正したSAMファイルをセットして、[公開バージョン]をクリックします。
004.png
SAMファイルに問題が無ければ、新しいバージョンとして登録されます。

##🔶 アプリを利用させたいAWSアカウントの登録
1. AWSアカウント番号の登録
新しいバージョンとして登録できたら、[Add]をクリックします。
005.png
アプリを利用させたいAWSアカウント番号をセットして、[Save]をクリックします。
006.png
問題が無ければ、以下のように登録されます。
007.png

##🔶 動作確認
対象のAWSアカウントで、Serverless Application Repositoryの、Private applicationsを検索します。
今回、IAMの登録もあるので、「Show apps that・・・」のチェックを入れる必要があります。
登録したアプリが見つかれば、デプロイを試してみてください。
008.png

##🔶 まとめ
以上の手順で、自作のサーバレスアプリを、他のAWSアカウントでも使えるようになります。

やはり難しいポイントはSAMファイルの設定で、慣れないとSAMファイルの登録時や、アプリのデプロイ時にエラーが頻発するので、根気よく頑張ってください。

便利なLambda関数を是非みんなに公開して、生産性をアップしていきましょう。

##🔶 参考

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?