BLOG

AWS Systems Manager Automation으로 임시 인스턴스 권한 부여하기
작성일: 2020년 2월 10일

인스턴스는 특정 API의 호출 또는 AWS Systems Manager Automation이 실행되는 동안의 특정 리소스라고 볼 수 있습니다. 만약 여러분이 인스턴스가 실행되는동안 인스턴스 프로필에 추가적인 권한을 적용하고 싶지 않을 땐 어떻게 할까요?

 

오늘 포스팅에서는 문서 내용에서 자동화를 실행할 때 인스턴스에서 임시 권한을 제공하는 방법에 대해 알려드리겠습니다. 첫 번째로는 사용자지정 IAM Policy를 생성할 예정이고, 다음으로 그 생성한 Policy를 사용하여 어떻게 임시적인 인스턴트 프로필을 생성하는지 보여드리겠습니다. 자동화가 실행되는 동안 프로파일은 Target 인스턴스에 연결되어있으며 실행이 종료 되기 전에 삭제됩니다.

 

AWS Systems Manager 는 AmazonSSMManagedInstanceCore IAM Policy를 제공하며 이는 인스턴스 프로필을 추가할 때, Systems manager core service가 원활하게 작동될 수 있게 합니다.

Workflow의 자동화에 따라 다르지만, 자동화 문서가 원활히 실행되기 위해서 추가적인 권한이 필요할 수도 있습니다.

 

각각의 자동화 워크 플로우에 대한 전용 IAM  policy를 생성한 후, 기존 인스턴스 프로파일을 수정 하지 않고도 인스턴스 프로파일 생성 및 첨부 파일대상 인스턴스에 대한 사용자 지정 자동화 문서에 통합할 수 있습니다.

 

만약 사용자가 장기적으로 인스턴스에 첨부된 프로필 수정을 변경하지 않는 다면 이는 굉장히 도움이 될 것입니다.

인스턴스 프로파일은 Systems Manager가 원활하게 실행되기 위한 핵심 권한만을 포함하지만 Amazon S3 또는 AWS KMS와 같은 리소스에 액세스해야 하는 자동화 기능도 가지고 있습니다.

 

예를 들어 다음 코드에서는 expandedPermissionForAutomation이라는 이름의 사용자 지정 IAM policy를 생성했고, 해당 IAM Policy는 S3를 대한 확장 권한이 포함되어 있습니다.

자세한 내용은 아래 Creating IAM Policies를 참고해 주시기 바랍니다.

{

    “Version”: “2012-10-17”,

    “Statement”: [

        {

            “Effect”: “Allow”,

            “Action”: [

                “ssm:DescribeAssociation”,

                “ssm:GetDeployablePatchSnapshotForInstance”,

                “ssm:GetDocument”,

                “ssm:GetManifest”,

                “ssm:GetParameters”,

                “ssm:ListAssociations”,

                “ssm:ListInstanceAssociations”,

                “ssm:PutInventory”,

                “ssm:PutComplianceItems”,

                “ssm:PutConfigurePackageResult”,

                “ssm:UpdateAssociationStatus”,

                “ssm:UpdateInstanceAssociationStatus”,

                “ssm:UpdateInstanceInformation”

            ],

            “Resource”: “*”

        },

        {

            “Effect”: “Allow”,

            “Action”: [

                “ssmmessages:CreateControlChannel”,

                “ssmmessages:CreateDataChannel”,

                “ssmmessages:OpenControlChannel”,

                “ssmmessages:OpenDataChannel”

            ],

            “Resource”: “*”

        },

        {

            “Effect”: “Allow”,

            “Action”: [

                “ec2messages:AcknowledgeMessage”,

                “ec2messages:DeleteMessage”,

                “ec2messages:FailMessage”,

                “ec2messages:GetEndpoint”,

                “ec2messages:GetMessages”,

                “ec2messages:SendReply”

            ],

            “Resource”: “*”

        },

        {

            “Effect”: “Allow”,

            “Action”: [

                “ec2:DescribeInstanceStatus”

            ],

            “Resource”: “*”

        },

        {

            “Effect”: “Allow”,

            “Action”: [

                “s3:GetBucketLocation”,

                “s3:PutObject”,

                “s3:GetObject”,

                “s3:GetEncryptionConfiguration”,

                “s3:AbortMultipartUpload”,

                “s3:ListMultipartUploadParts”,

                “s3:ListBucket”,

                “s3:ListBucketMultipartUploads”

            ],

           “Resource”: [

                “arn:aws:s3:::my-script-bucket”,

                “arn:aws:s3:::my-script-bucket/*”

            ]

        }

    ]

}

 

이제 우리가 원했던 권한이 있는 policy가 생성되었습니다. aws:excuteAwsApiplugin을 사용하여

Role creation, 인스턴스 프로파일 생성, 그리고 타겟 인스턴스의 자동화 인스턴스의 대상 인스턴

스와의 연관을 통합할 수 있습니다. 자세한 내용은 Systems Manager Automation Actions Reference를 참고해 주시기 바랍니다.

 

이렇게 다음의 코드로 사용자 지정 자동화 문서에서 이러한 단계들을 어떻게 실행하는지 보여드렸습니다. 실행에 실패할 때 onfailure 속성이 발견된다면 몇 가지의 단계를 통하여 문제를 해결할 수 있습니다.

 

첫 번째 단계로는 타겟 인스턴스와 함께 현재 사용되는 인스턴스 프로필의 세부 정보를 수집하는 것입니다. 그 후에 추가 권한이 필요한 단계를 진행하기 전에 AWS-AttachIAMToInstance Automation을 사용하여 임시 인스턴스 프로파일을 생성하고 타겟 인스턴스와 연결할 수 있습니다. 일반적으로, 이러한 단계는 세부 사항에 따라 policy에 적용된 권한이 필요한 인스턴스가 수행한 조치보다 먼저 실행 될 것입니다.

       {

            “name”: “getOriginalInstanceProfile”,

            “action”: “aws:executeAwsApi”,

            “onFailure”: “Abort”,

            “inputs”: {

                “Service”: “ec2”,

                “Api”: “DescribeIamInstanceProfileAssociations”,

                “Filters”: [

                    {

                        “Name”: “instance-id”,

                        “Values”: [“{{ InstanceId }}”]

                    }

                ]

            },

            “outputs”: [

                {

                    “Name”: “instanceProfileArn”,

                    “Selector”: “$.IamInstanceProfileAssociations[0].IamInstanceProfile.Arn”,

                    “Type”: “String”

                },

                {

                    “Name”: “associationId”,

                    “Selector”: “$.IamInstanceProfileAssociations[0].AssociationId”,

                    “Type”: “String”

                }

            ],

            “nextStep”: “createTempAutomationInstanceRole”

        },

        {

            “name”: “createTempAutomationInstanceRole”,

            “action”: “aws:executeAwsApi”,

            “onFailure”: “Abort”,

            “inputs”: {

                “Service”: “iam”,

                “Api”: “CreateRole”,

                “AssumeRolePolicyDocument”: “{\”Version\”:\”2012-10-17\”,\”Statement\”:[{\”Effect\”:\”Allow\”,\”Principal\”:{\”Service\”:[\”ec2.amazonaws.com\”]},\”Action\”:[\”sts:AssumeRole\”]}]}”,

                “RoleName”: “tempAutomationInstanceRole”

                },

            “nextStep”: “attachTempAutomationPolicy”

        },

        {

            “name”: “attachTempAutomationPolicy”,

            “action”: “aws:executeAwsApi”,

            “onFailure”: “step:detachTempAutomationPolicy”,

            “inputs”: {

                “Service”: “iam”,

                “Api”: “AttachRolePolicy”,

                “PolicyArn”: “arn:aws:iam::01234567890:policy/expandedPermissionsForAutomation”,

                “RoleName”: “tempAutomationInstanceRole”

                },

            “nextStep”: “executeAttachIAMAutomation”

        },

        {

            “name”: “executeAttachIAMAutomation”,

            “action”: “aws:executeAutomation”,

            “onFailure”: “step:removeTempAutomationRoleFromInstanceProfile”,

            “inputs”: {

                “DocumentName”: “AWS-AttachIAMToInstance”,

                “RuntimeParameters”: {

                    “RoleName”: [“tempAutomationInstanceRole”],

                    “InstanceId”: [“{{ InstanceId }}”]

                }

            },

            “nextStep”: “verifyTempInstanceProfileAssociation”

        }

 

tempAutomationInstanceRole을 연결한 후, aws:waitForAwsResourceProperty plugin을 사용하여 권한을 적용하는 단계를 진행하기 전에 State value가 반영되었는지 확인이 필요합니다. 또한 임시 인스턴스와 연결된 타겟 인스턴스 프로파일의 세부 정보를 수집하여야 하며 이것은 나중에 기존의 인스턴스 프로파일에 재연결시 사용됩니다.

 

다음으로는 임시 인스턴스 프로파일이 제공하는 확장 권한을 사용하는 방법을 보여드리기 위해 AWS-RunRemoteScript command 명령을 실행해보겠습니다.

       {

            “name”: “verifyTempInstanceProfileAssociation”,

            “action”: “aws:waitForAwsResourceProperty”,

            “maxAttempts”: 10,

            “onFailure”: “Abort”,

            “inputs”: {

              “Service”: “ec2”,

              “Api”: “DescribeIamInstanceProfileAssociations”,

              “Filters”: [

                {

                  “Name”: “instance-id”,

                  “Values”: [“{{ InstanceId }}”]

                }

              ],

              “PropertySelector”: “$.IamInstanceProfileAssociations[0].State”,

              “DesiredValues”: [

                “associated”

              ]

            },

            “nextStep”: “getTempInstanceProfile”

        },

        {

          “name”: “getTempInstanceProfile”,

          “action”: “aws:executeAwsApi”,

          “onFailure”: “step:associateOriginalInstanceProfile”,

          “inputs”: {

              “Service”: “ec2”,

              “Api”: “DescribeIamInstanceProfileAssociations”,

              “Filters”: [

                  {

                      “Name”: “instance-id”,

                      “Values”: [“{{ InstanceId }}”]

                  }

              ]

          },

          “outputs”: [

              {

                  “Name”: “instanceProfileArn”,

                  “Selector”: “$.IamInstanceProfileAssociations[0].IamInstanceProfile.Arn”,

                  “Type”: “String”

              },

              {

                  “Name”: “associationId”,

                  “Selector”: “$.IamInstanceProfileAssociations[0].AssociationId”,

                  “Type”: “String”

              }

          ],

          “nextStep”: “runScriptFromS3”

        },

       {

          “name”: “runScriptFromS3”,

          “action”: “aws:runCommand”,

          “onFailure”: “step:associateOriginalInstanceProfile”,

          “inputs”: {

              “DocumentName”: “AWS-RunRemoteScript”,

              “InstanceIds”: [“{{ InstanceId }}”],

              “Parameters”: {

                “sourceType”: “S3”,

                “sourceInfo”: {

                  “path”: “https://my-script-bucket.s3-us-west-

2.amazonaws.com/exampleScript.py”

                },

                “commandLine”: “python3 exampleScript.py”

              }

          },

          “nextStep”: “associateOriginalInstanceProfile”

        }

 

확장 권한이 필요한 작업이 완료 되었다면 임시 인스턴스 프로파일을 기존의 인스턴스 파일로 변경할 수 있습니다. 이를 변경하기 위해서는, 이전 단계의 아웃풋을 사용하여야 합니다. 재연결을 한 후 tempAutomationInstanceRole은 실행에 더 필요하지 않으므로 삭제할 수 있습니다. 자세한 내용은 Deleting an IAM Role (AWS API)를 참고 부탁 드립니다.

 

 

결론

오늘은 임시 인스턴스 프로파일을 통해 자동화가 실행되는 동안 타겟 인스턴스에 임시적으로 권한을 부여하는 방법을 설명해 드렸습니다. 이를 통하여 인스턴스에 장기적으로 연결하고 System Manager가 원활히 실행되기 위하여 핵심 권한만 포함하는 인스턴스 파일을 수정하지 않아도 됩니다. 추가적인 내용은 사용자 설명서에 포함된 AWS Systems Manager Automation을 참고 부탁 드립니다.

 


저자소개

Caleb Gutierrez은 AWS Premium Support의 클라우드 서포트 엔지니어로 재직중이며 Amazon EC2 Windows, AWS Directory Service, AWS System Manager, 그리고 Micorsoft PowerShell을 전문으로 합니다. 일 외에는 봉사활동, 하이킹, 그리고 암벽등반을 즐겨 합니다.

 

 

 

 

 

 


원문 URL : https://aws.amazon.com/ko/blogs/mt/providing-temporary-instance-permissions-with-aws-systems-manager-automations/

 

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 개제하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달드리도록 하겠습니다.